Summary
From all the combination of Z variables for a particular outcome I use the following methods for model selection
- Filter those results for which the sign of the double interaction terms for GQ and NSEW (\(Distance^{GQ/NSEW}_{i, 0-40}*Post^{GQ/NSEW}_{i,t}\)) is positive.
- From all the specifications with positive terms, I pick the spec that minimizes the combined p value of all the terms of interest.
- The second method picks the specification that maximizes the
- Maximizes the adjusted R square
- Maximize without checking for the signs on the double interaction terms for GQ and NSEW
- Filter out those that have positive GQ and NSEW and then maximize R-Square
Minimizes the Bayesian information criterion (BIC)
Minimizes the Akaike information criterion (AIC).
The current specification for selecting z variables is as follows: \[Y_{i,t} = Distance^{GQ}_{i} + Distance^{NSEW}_{i} + Z^{capital}_{i,t} + Z^{labour}_{i,t} + Z^{land}_{i,t} + Z^{product}_{i,t} + Distance^{GQ}_{i}*Post^{GQ}_{i,t} + Distance^{NSEW}_{i}*Post^{NSEW}_{i,t} + \\Distance^{GQ}_{i}*Post^{GQ}_{i,t}*Z^{capital}_{i,t} + Distance^{GQ}_{i}*Post^{GQ}_{i,t}*Z^{labour}_{i,t} + Distance^{GQ}_{i}*Post^{GQ}_{i,t}*Z^{land}_{i,t} + Distance^{GQ}_{i}*Post^{GQ}_{i,t}*Z^{product}_{i,t} \\+ Distance^{NSEW}_{i}*Post^{NSEW}_{i,t}*Z^{capital}_{i,t} + Distance^{NSEW}_{i}*Post^{NSEW}_{i,t}*Z^{labour}_{i,t} + Distance^{NSEW}_{i}*Post^{NSEW}_{i,t}*Z^{land}_{i,t} +\\ Distance^{NSEW}_{i}*Post^{NSEW}_{i,t}*Z^{product}_{i,t} + State * Year\]
NOTE The outcome log of GDP per capita has no combinations of z variables for which both the NSEW and GQ double interaction terms (\(Distance^{GQ}_{i}*Post^{GQ}_{i,t}\)) are both positive.. The only change in the specification was that the Z variables for land were reduced to only cr_s.
unique(regressionResults$yVar)[!(unique(regressionResults$yVar) %in% unique(pValueSelection$yVar))]
[1] "logGdpPc"
Making all the charts
The code for creating the results is hidden to make this report concise. The section below loops through all the results for each model selection process and creates charts for each.
All the charts in reference to the terms that are relevant for GQ
1. All minimum P Value
varList <- zVars %>%
mutate(zVarCombo = paste(capitalVar, labourVar, landVar, productVar, sep = ", ")) %>%
select(yVar, zVarCombo)
for(i in 1:length(varList$yVar)){
yvarTemp <- varList[i, ]$yVar
zVarComboTemp <- varList[i, ]$zVarCombo
chartData <- percentileValues %>%
filter(yVar == yvarTemp & zVarCombo == zVarComboTemp)
titleName <- unique(chartData$title)
subTitleName <- unique(chartData$zVarCombo)
print(createCharts(chartData, titleName, subTitleName))
}

















2. GQ/NSEW minimum P Value
varList <- zVars %>%
mutate(zVarCombo = paste(capitalVar, labourVar, landVar, productVar, sep = ", ")) %>%
select(yVar, zVarCombo)
for(i in 1:length(varList$yVar)){
yvarTemp <- varList[i, ]$yVar
zVarComboTemp <- varList[i, ]$zVarCombo
chartData <- percentileValues %>%
filter(yVar == yvarTemp & zVarCombo == zVarComboTemp)
titleName <- unique(chartData$title)
subTitleName <- unique(chartData$zVarCombo)
print(createCharts(chartData, titleName, subTitleName))
}

















3. Maximizing R-SQUARE
varList <- zVars %>%
mutate(zVarCombo = paste(capitalVar, labourVar, landVar, productVar, sep = ", ")) %>%
select(yVar, zVarCombo)
for(i in 1:length(varList$yVar)){
yvarTemp <- varList[i, ]$yVar
zVarComboTemp <- varList[i, ]$zVarCombo
chartData <- percentileValues %>%
filter(yVar == yvarTemp & zVarCombo == zVarComboTemp)
titleName <- unique(chartData$title)
subTitleName <- unique(chartData$zVarCombo)
print(createCharts(chartData, titleName, subTitleName))
}























3. Maximizing R-SQUARE After filtering positive GQ/NSEW
varList <- zVars %>%
mutate(zVarCombo = paste(capitalVar, labourVar, landVar, productVar, sep = ", ")) %>%
select(yVar, zVarCombo)
for(i in 1:length(varList$yVar)){
yvarTemp <- varList[i, ]$yVar
zVarComboTemp <- varList[i, ]$zVarCombo
chartData <- percentileValues %>%
filter(yVar == yvarTemp & zVarCombo == zVarComboTemp)
titleName <- unique(chartData$title)
subTitleName <- unique(chartData$zVarCombo)
print(createCharts(chartData, titleName, subTitleName))
}


















Temporary section for checks
step(plm(logGdpPc ~ gqDistType + nsewDistType + e_pr_fin3 + edu_ter_15_t+ cr_s + est_sh_1 + gqDistType * postGQ + nsewDistType * postNSEW + gqDistType * postGQ * e_pr_fin3 + gqDistType * postGQ * edu_ter_15_t + gqDistType * postGQ * cr_s + gqDistType * postGQ * est_sh_1 + nsewDistType * postNSEW * e_pr_fin3 + nsewDistType * postNSEW * edu_ter_15_t + nsewDistType * postNSEW * cr_s + nsewDistType * postNSEW * est_sh_1 + gqDistType*postGQ*nsewDistType*postNSEW + spatialState * year, data = allData), direction = "both")
This series is NA and has been removed: hous_slm
Error in UseMethod("extractAIC") :
no applicable method for 'extractAIC' applied to an object of class "c('plm', 'panelmodel')"
In addition: There were 14 warnings (use warnings() to see them)
LS0tCnRpdGxlOiAiTW9kZWwgU2VsZWN0aW9uOiBJZGVudGlmeWluZyB0aGUgWiB2YXJzIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdAogIHBkZl9kb2N1bWVudDogZGVmYXVsdApkYXRlOiAnYHIgU3lzLkRhdGUoKWAnCi0tLQojI1N1bW1hcnkKCkZyb20gYWxsIHRoZSBjb21iaW5hdGlvbiBvZiBaIHZhcmlhYmxlcyBmb3IgYSBwYXJ0aWN1bGFyIG91dGNvbWUgSSB1c2UgdGhlIGZvbGxvd2luZyBtZXRob2RzIGZvciBtb2RlbCBzZWxlY3Rpb24KCjEuIEZpbHRlciB0aG9zZSByZXN1bHRzIGZvciB3aGljaCB0aGUgc2lnbiBvZiB0aGUgZG91YmxlIGludGVyYWN0aW9uIHRlcm1zIGZvciBHUSBhbmQgTlNFVyAoJERpc3RhbmNlXntHUS9OU0VXfV97aSwgMC00MH0qUG9zdF57R1EvTlNFV31fe2ksdH0kKSBpcyBwb3NpdGl2ZS4KICAgIGEuIEZyb20gYWxsIHRoZSBzcGVjaWZpY2F0aW9ucyB3aXRoIHBvc2l0aXZlIHRlcm1zLCBJIHBpY2sgdGhlIHNwZWMgdGhhdCBtaW5pbWl6ZXMgdGhlIGNvbWJpbmVkIHAgdmFsdWUgb2YgYWxsIHRoZSB0ZXJtcyBvZiBpbnRlcmVzdC4KICAgIGIuIFRoZSBzZWNvbmQgbWV0aG9kIHBpY2tzIHRoZSBzcGVjaWZpY2F0aW9uIHRoYXQgbWF4aW1pemVzIHRoZQoyLiBNYXhpbWl6ZXMgdGhlIGFkanVzdGVkIFIgc3F1YXJlCiAgICBhLiBNYXhpbWl6ZSB3aXRob3V0IGNoZWNraW5nIGZvciB0aGUgc2lnbnMgb24gdGhlIGRvdWJsZSBpbnRlcmFjdGlvbiB0ZXJtcyBmb3IgR1EgYW5kIE5TRVcKICAgIGIuIEZpbHRlciBvdXQgdGhvc2UgdGhhdCBoYXZlIHBvc2l0aXZlIEdRIGFuZCBOU0VXIGFuZCB0aGVuIG1heGltaXplIFItU3F1YXJlCjMuIH5+TWluaW1pemVzIHRoZSAgQmF5ZXNpYW4gaW5mb3JtYXRpb24gY3JpdGVyaW9uIChCSUMpfn4KNC4gfn5NaW5pbWl6ZXMgdGhlICBBa2Fpa2UgaW5mb3JtYXRpb24gY3JpdGVyaW9uIChBSUMpLn5+CgpUaGUgY3VycmVudCBzcGVjaWZpY2F0aW9uIGZvciBzZWxlY3RpbmcgeiB2YXJpYWJsZXMgaXMgYXMgZm9sbG93czoKJCRZX3tpLHR9ID0gRGlzdGFuY2Vee0dRfV97aX0gKyBEaXN0YW5jZV57TlNFV31fe2l9ICsgWl57Y2FwaXRhbH1fe2ksdH0gKyBaXntsYWJvdXJ9X3tpLHR9ICsgWl57bGFuZH1fe2ksdH0gKyBaXntwcm9kdWN0fV97aSx0fSArIERpc3RhbmNlXntHUX1fe2l9KlBvc3Ree0dRfV97aSx0fSArIERpc3RhbmNlXntOU0VXfV97aX0qUG9zdF57TlNFV31fe2ksdH0gKyBcXERpc3RhbmNlXntHUX1fe2l9KlBvc3Ree0dRfV97aSx0fSpaXntjYXBpdGFsfV97aSx0fSArIERpc3RhbmNlXntHUX1fe2l9KlBvc3Ree0dRfV97aSx0fSpaXntsYWJvdXJ9X3tpLHR9ICsgRGlzdGFuY2Vee0dRfV97aX0qUG9zdF57R1F9X3tpLHR9Klpee2xhbmR9X3tpLHR9ICsgRGlzdGFuY2Vee0dRfV97aX0qUG9zdF57R1F9X3tpLHR9Klpee3Byb2R1Y3R9X3tpLHR9IFxcKyBEaXN0YW5jZV57TlNFV31fe2l9KlBvc3Ree05TRVd9X3tpLHR9Klpee2NhcGl0YWx9X3tpLHR9ICsgRGlzdGFuY2Vee05TRVd9X3tpfSpQb3N0XntOU0VXfV97aSx0fSpaXntsYWJvdXJ9X3tpLHR9ICsgRGlzdGFuY2Vee05TRVd9X3tpfSpQb3N0XntOU0VXfV97aSx0fSpaXntsYW5kfV97aSx0fSArXFwgRGlzdGFuY2Vee05TRVd9X3tpfSpQb3N0XntOU0VXfV97aSx0fSpaXntwcm9kdWN0fV97aSx0fSArIFN0YXRlICogWWVhciQkCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRX0Kcm0obGlzdCA9IGxzKCkpCmxpYnJhcnkodGlkeXZlcnNlKQpyZWdyZXNzaW9uUmVzdWx0cyA8LSByZWFkX2NzdigicmVncmVzc2lvblJlc3VsdHNaVmFyc0FwcjIwTm9RdWFkLmNzdiIpCnlWYXJzIDwtIHJlYWRfY3N2KCIuLi9kYXRhLzEgQ2xlYW5lZCBmaWxlcyBmb3IgYW5hbHlzaXMvUmVncmVzc2lvbiBWYXJpYWJsZXMveVZhcnNGaW5hbC5jc3YiKSAlPiUgCiAgICAgICAgc2VsZWN0KHZhck5hbWVzLCB5VHlwZSwgZGVzY3JpcHRpb24pICU+JSAKICAgICAgICBhcnJhbmdlKHlUeXBlLCB2YXJOYW1lcykKdGFibGVOYW1lcyA8LSByZWFkX2NzdigidGFibGVOYW1lcy5jc3YiKQoKIyNUaGUgcmVncmVzc2lvbiBkYXRhCmxvYWQoIi4uL2RhdGEvMSBDbGVhbmVkIGZpbGVzIGZvciBhbmFseXNpcy9hbGxEYXRhLlJEQSIpCmBgYAoKCmBgYHtyLCBlY2hvPUZBTFNFfQojICMjTW9kZWwgU2VsZWN0aW9uCiMgSW4gdGhpcyBwYXJ0IEkgc2VsZWN0IHRoZSBtb2RlbHMgYmFzZWQgb24gZWl0aGVyIHAgdmFsdWUgb3IgdGhlIGFkanVzdGVkIFIgc3F1YXJlLCBmb3JtYXQgYW5kIHNhdmUgdGhlIHJlc3VsdHMuCiMgIyNVc2luZyBQIHZhbHVlCiMgVGhlIGZpcnN0IGNvbmRpdGlvbiBmb3IgdGhlIG1vZGVsIHNlbGVjdGlvbiBwcm9jZXNzIHVzaW5nIHAgdmFsdWVzIGlzIHRvIGZpbHRlciBvdXQgb25seSB0aG9zZSBjb21iaW5hdGlvbiBmb3Igd2hpY2ggdGhlIHRoZSBzaWducyBvZiB0aGUgaW50ZXJhY3Rpb24gdGVybXMgYmV0d2VlbiB0aGUgdHJlYXRtZW50IGFuZCB0aGUgcG9zdCB2YXJpYWJsZXMgYXJlIHBvc2l0aXZlLgojIAojICoqU3RlcCAxOiBGaWx0ZXIgb3V0IHRoZSByZWdyZXNzaW9ucyB3aXRoIG5lZ2F0aXZlIEdRL05TRVcgZXN0aW1hdGVzKioKcFZhbHVlU2VsZWN0aW9uIDwtIHJlZ3Jlc3Npb25SZXN1bHRzICU+JSAKICAgICAgICBncm91cF9ieSh5VmFyLCB6VmFyQ29tYm8pICU+JQogICAgICAgIGZpbHRlcihlc3RpbWF0ZVt0ZXJtID09ICJncURpc3RUeXBlMC00MDpwb3N0R1EiXSA+IDAgJiBlc3RpbWF0ZVt0ZXJtID09ICJuc2V3RGlzdFR5cGUwLTQwOnBvc3ROU0VXIl0gPiAwICkgJT4lIAogICAgICAgIHVuZ3JvdXAoKQpgYGAKKipOT1RFKioKPHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6I0ZGRDcwMSI+VGhlIG91dGNvbWUgbG9nIG9mIEdEUCBwZXIgY2FwaXRhIGhhcyBubyBjb21iaW5hdGlvbnMgb2YgeiB2YXJpYWJsZXMgZm9yIHdoaWNoIGJvdGggdGhlIE5TRVcgYW5kIEdRIGRvdWJsZSBpbnRlcmFjdGlvbiB0ZXJtcyAoJERpc3RhbmNlXntHUX1fe2l9KlBvc3Ree0dRfV97aSx0fSQpIGFyZSBib3RoIHBvc2l0aXZlLjwvc3Bhbj4uIFRoZSBvbmx5IGNoYW5nZSBpbiB0aGUgc3BlY2lmaWNhdGlvbiB3YXMgdGhhdCB0aGUgWiB2YXJpYWJsZXMgZm9yIGxhbmQgd2VyZSByZWR1Y2VkIHRvIG9ubHkgY3Jfcy4KYGBge3J9CnVuaXF1ZShyZWdyZXNzaW9uUmVzdWx0cyR5VmFyKVshKHVuaXF1ZShyZWdyZXNzaW9uUmVzdWx0cyR5VmFyKSAlaW4lIHVuaXF1ZShwVmFsdWVTZWxlY3Rpb24keVZhcikpXQpgYGAKCgpgYGB7ciwgZWNobz1GQUxTRX0KIyAqKlN0ZXAgMWE6IE1pbmltaXppbmcgdGhlIHAgdmFsdWUgb2YgYWxsIHRlcm1zKioKYWxsTWluaW11bSA8LSBwVmFsdWVTZWxlY3Rpb24gJT4lIAogICAgICAgIGdyb3VwX2J5KHlWYXIsIHpWYXJDb21ibykgJT4lIAogICAgICAgIG11dGF0ZShwU3VtID0gc3VtKHAudmFsdWUpKSAlPiUgCiAgICAgICAgdW5ncm91cCgpICU+JSAKICAgICAgICBncm91cF9ieSh5VmFyKSAlPiUgCiAgICAgICAgZmlsdGVyKHBTdW0gPT0gbWluKHBTdW0sIG5hLnJtID0gVCkpICU+JSAKICAgICAgICB1bmdyb3VwKCkgJT4lIAogICAgICAgIG11dGF0ZShlc3RpbWF0ZSA9IGlmZWxzZShpcy5uYShlc3RpbWF0ZSksIE5BLCBpZmVsc2UocC52YWx1ZSA8PSAwLjAxLCBwYXN0ZShyb3VuZChlc3RpbWF0ZSwgNCksICIqKioiLCBzZXA9IiIpLCBpZmVsc2UocC52YWx1ZSA8PSAwLjA1LCBwYXN0ZShyb3VuZChlc3RpbWF0ZSwgNCksICIqKiIsIHNlcD0iIiksIGlmZWxzZShwLnZhbHVlIDw9IDAuMSwgcGFzdGUocm91bmQoZXN0aW1hdGUsIDQpLCAiKiIsIHNlcD0iIiksIGFzLmNoYXJhY3Rlcihyb3VuZChlc3RpbWF0ZSwgNCkpKSkpKSkgJT4lIAogICAgICAgIHNlbGVjdCh5VmFyLCB6VmFyQ29tYm8sIHRlcm0sIGVzdGltYXRlKSAlPiUgCiAgICAgICAgc3ByZWFkKHRlcm0sIGVzdGltYXRlKSAlPiUgCiAgICAgICAgc2VwYXJhdGUoelZhckNvbWJvLCBpbnRvID0gYygiY2FwaXRhbFZhciIsICJsYWJvdXJWYXIiLCAibGFuZFZhciIsICJwcm9kdWN0VmFyIiksIHNlcCA9ICJcXCwiKSAlPiUgCiAgICAgICAgbGVmdF9qb2luKC4sIHlWYXJzLCBieSA9IGMoInlWYXIiID0gInZhck5hbWVzIikpJT4lIAogICAgICAgIGFycmFuZ2UoeVR5cGUsIHlWYXIpICU+JSAKICAgICAgICBzZWxlY3Qob25lX29mKHRhYmxlTmFtZXMkcmF3TmFtZXMpKSAjI29yZGVyIGJhc2VkIG9uIGZpbmFsIG5hbWVzIGxpc3RzCgpuYW1lcyhhbGxNaW5pbXVtKSA8LSB0YWJsZU5hbWVzJGZpbmFsTmFtZXMgIyNjaGFuZ2UgbmFtZXMKCiN3cml0ZV9jc3YoZmluYWxMaXN0MSwgIi4uL1Jlc3VsdHMvVGFibGVzL2FsbE1pbmltdW0xcG92ZXJ0eS5jc3YiKQpgYGAKCgpgYGB7ciwgZWNobz1GQUxTRX0KIyAqKlN0ZXAgMWI6IE1pbmltaXppbmcgdGhlIHAgdmFsdWUgZm9yIEdRIGFuZCBOU0VXIHRlcm1zKioKZ3Fuc2V3TWluaW11bSA8LSBwVmFsdWVTZWxlY3Rpb24gJT4lIAogICAgICAgIGdyb3VwX2J5KHlWYXIsIHpWYXJDb21ibykgJT4lIAogICAgICAgIG11dGF0ZShwU3VtID0gc3VtKHAudmFsdWVbdGVybSA9PSAiZ3FEaXN0VHlwZTAtNDA6cG9zdEdRIl0sIHAudmFsdWVbdGVybSA9PSAibnNld0Rpc3RUeXBlMC00MDpwb3N0TlNFVyJdLCBuYS5ybSA9IFQpKSAlPiUgCiAgICAgICAgdW5ncm91cCgpICU+JSAKICAgICAgICBncm91cF9ieSh5VmFyKSAlPiUgCiAgICAgICAgZmlsdGVyKHBTdW0gPT0gbWluKHBTdW0sIG5hLnJtID0gVCkpICU+JQogICAgICAgIHVuZ3JvdXAoKSAlPiUgCiAgICAgICAgbXV0YXRlKGVzdGltYXRlID0gaWZlbHNlKGlzLm5hKGVzdGltYXRlKSwgTkEsIGlmZWxzZShwLnZhbHVlIDw9IDAuMDEsIHBhc3RlKHJvdW5kKGVzdGltYXRlLCA0KSwgIioqKiIsIHNlcD0iIiksIGlmZWxzZShwLnZhbHVlIDw9IDAuMDUsIHBhc3RlKHJvdW5kKGVzdGltYXRlLCA0KSwgIioqIiwgc2VwPSIiKSwgaWZlbHNlKHAudmFsdWUgPD0gMC4xLCBwYXN0ZShyb3VuZChlc3RpbWF0ZSwgNCksICIqIiwgc2VwPSIiKSwgYXMuY2hhcmFjdGVyKHJvdW5kKGVzdGltYXRlLCA0KSkpKSkpKSAlPiUgCiAgICAgICAgc2VsZWN0KHlWYXIsIHpWYXJDb21ibywgdGVybSwgZXN0aW1hdGUpICU+JSAKICAgICAgICBzcHJlYWQodGVybSwgZXN0aW1hdGUpICU+JSAKICAgICAgICBzZXBhcmF0ZSh6VmFyQ29tYm8sIGludG8gPSBjKCJjYXBpdGFsVmFyIiwgImxhYm91clZhciIsICJsYW5kVmFyIiwgInByb2R1Y3RWYXIiKSwgc2VwID0gIlxcLCIpICU+JSAKICAgICAgICBsZWZ0X2pvaW4oLiwgeVZhcnMsIGJ5ID0gYygieVZhciIgPSAidmFyTmFtZXMiKSklPiUgCiAgICAgICAgYXJyYW5nZSh5VHlwZSwgeVZhcikgJT4lIAogICAgICAgIHNlbGVjdChvbmVfb2YodGFibGVOYW1lcyRyYXdOYW1lcykpICMjb3JkZXIgYmFzZWQgb24gZmluYWwgbmFtZXMgbGlzdHMKCm5hbWVzKGdxbnNld01pbmltdW0pIDwtIHRhYmxlTmFtZXMkZmluYWxOYW1lcyAjI2NoYW5nZSBuYW1lcwoKI3dyaXRlX2NzdihmaW5hbExpc3QyLCAiLi4vUmVzdWx0cy9UYWJsZXMvR1FOU0VXTWluaW11bTFwb3ZlcnR5LmNzdiIpCmBgYAoKCmBgYHtyLCBlY2hvPUZBTFNFfQojICMjU2VsZWN0aW5nIGJhc2VkIG9uIHRoZSBBZGp1c3RlZCBSLVNxdWFyZQojIEZvciB0aGlzIHNlY3Rpb24gdGhlIGNyaXRlcmlvbiBpcyBtYXhpbWl6aW5nIHRoZSBSLVNxdWFyZS4KIyAKIyAqKlN0ZXAgMmE6IEZpbHRlciBiYXNlZCBvbiBtYXgoUi1TcXVhcmUpKioKIyBTb21lIG9mIHRoZSBvdXRjb21lIHZhcmlhYmxlcyBoYXZlIG11bHRpcGxlIHNwZWNpZmljYXRpb25zIHdpdGggdGhlIHNhbWUgUi1TcXVhcmUgdmFsdWUuIFNvIHRoZSBmaW5hbCB0YWJsZSBoYXMgbXVsdGlwbGUgc3BlY3MgZm9yIHNvbWUgb2YgdGhlIG91dGNvbWVzLgpyU3F1YXJlU2VsZWN0aW9uIDwtIHJlZ3Jlc3Npb25SZXN1bHRzICU+JSAKICAgICAgICBncm91cF9ieSh5VmFyKSAlPiUKICAgICAgICBmaWx0ZXIoYWRqUlNxID09IG1heChhZGpSU3EpKSAlPiUgCiAgICAgICAgdW5ncm91cCgpICU+JSAKICAgICAgICBtdXRhdGUoZXN0aW1hdGUgPSBpZmVsc2UoaXMubmEoZXN0aW1hdGUpLCBOQSwgaWZlbHNlKHAudmFsdWUgPD0gMC4wMSwgcGFzdGUocm91bmQoZXN0aW1hdGUsIDQpLCAiKioqIiwgc2VwPSIiKSwgaWZlbHNlKHAudmFsdWUgPD0gMC4wNSwgcGFzdGUocm91bmQoZXN0aW1hdGUsIDQpLCAiKioiLCBzZXA9IiIpLCBpZmVsc2UocC52YWx1ZSA8PSAwLjEsIHBhc3RlKHJvdW5kKGVzdGltYXRlLCA0KSwgIioiLCBzZXA9IiIpLCBhcy5jaGFyYWN0ZXIocm91bmQoZXN0aW1hdGUsIDQpKSkpKSkpICU+JSAKICAgICAgICBzZWxlY3QoeVZhciwgelZhckNvbWJvLCB0ZXJtLCBlc3RpbWF0ZSkgJT4lIAogICAgICAgIHNwcmVhZCh0ZXJtLCBlc3RpbWF0ZSkgJT4lIAogICAgICAgIHNlcGFyYXRlKHpWYXJDb21ibywgaW50byA9IGMoImNhcGl0YWxWYXIiLCAibGFib3VyVmFyIiwgImxhbmRWYXIiLCAicHJvZHVjdFZhciIpLCBzZXAgPSAiXFwsIikgJT4lIAogICAgICAgIGxlZnRfam9pbiguLCB5VmFycywgYnkgPSBjKCJ5VmFyIiA9ICJ2YXJOYW1lcyIpKSU+JSAKICAgICAgICBhcnJhbmdlKHlUeXBlLCB5VmFyKSAlPiUgCiAgICAgICAgc2VsZWN0KG9uZV9vZih0YWJsZU5hbWVzJHJhd05hbWVzKSkgIyNvcmRlciBiYXNlZCBvbiBmaW5hbCBuYW1lcyBsaXN0cwoKbmFtZXMoclNxdWFyZVNlbGVjdGlvbikgPC0gdGFibGVOYW1lcyRmaW5hbE5hbWVzICMjY2hhbmdlIG5hbWVzCmBgYAoKCgpgYGB7ciwgZWNobz1GQUxTRX0KIyAqKlN0ZXAgMmI6IEZpbHRlciBQb3NpdGl2ZSBHUSBOU0VXIGJlZm9yZSBtYXgoUi1TcXVhcmUpKioKIyBJbiB0aGlzIGNhc2UgSSBmaXJzdCBzZWxlY3QgdGhlIHNwZWNzIHRoYXQgaGF2ZSBwb3NpdGl2ZSBHUSBhbmQgTlNFVyB0ZXJtcyBiZWZvcmUgYXBwbHlpbmcgdGhlIG1heChSLVNxdWFyZSkgY3JpdGVyaW9uLgpyU3F1YXJlUG9zaXRpdmUgPC0gcmVncmVzc2lvblJlc3VsdHMgJT4lIAogICAgICAgIGdyb3VwX2J5KHlWYXIsIHpWYXJDb21ibykgJT4lCiAgICAgICAgZmlsdGVyKGVzdGltYXRlW3Rlcm0gPT0gImdxRGlzdFR5cGUwLTQwOnBvc3RHUSJdID4gMCAmIGVzdGltYXRlW3Rlcm0gPT0gIm5zZXdEaXN0VHlwZTAtNDA6cG9zdE5TRVciXSA+IDAgKSAlPiUgCiAgICAgICAgdW5ncm91cCgpICU+JSAKICAgICAgICBncm91cF9ieSh5VmFyKSAlPiUKICAgICAgICBmaWx0ZXIoYWRqUlNxID09IG1heChhZGpSU3EpKSAlPiUgCiAgICAgICAgdW5ncm91cCgpICU+JSAKICAgICAgICBtdXRhdGUoZXN0aW1hdGUgPSBpZmVsc2UoaXMubmEoZXN0aW1hdGUpLCBOQSwgaWZlbHNlKHAudmFsdWUgPD0gMC4wMSwgcGFzdGUocm91bmQoZXN0aW1hdGUsIDQpLCAiKioqIiwgc2VwPSIiKSwgaWZlbHNlKHAudmFsdWUgPD0gMC4wNSwgcGFzdGUocm91bmQoZXN0aW1hdGUsIDQpLCAiKioiLCBzZXA9IiIpLCBpZmVsc2UocC52YWx1ZSA8PSAwLjEsIHBhc3RlKHJvdW5kKGVzdGltYXRlLCA0KSwgIioiLCBzZXA9IiIpLCBhcy5jaGFyYWN0ZXIocm91bmQoZXN0aW1hdGUsIDQpKSkpKSkpICU+JSAKICAgICAgICBzZWxlY3QoeVZhciwgelZhckNvbWJvLCB0ZXJtLCBlc3RpbWF0ZSkgJT4lIAogICAgICAgIHNwcmVhZCh0ZXJtLCBlc3RpbWF0ZSkgJT4lIAogICAgICAgIHNlcGFyYXRlKHpWYXJDb21ibywgaW50byA9IGMoImNhcGl0YWxWYXIiLCAibGFib3VyVmFyIiwgImxhbmRWYXIiLCAicHJvZHVjdFZhciIpLCBzZXAgPSAiXFwsIikgJT4lIAogICAgICAgIGxlZnRfam9pbiguLCB5VmFycywgYnkgPSBjKCJ5VmFyIiA9ICJ2YXJOYW1lcyIpKSU+JSAKICAgICAgICBhcnJhbmdlKHlUeXBlLCB5VmFyKSAlPiUgCiAgICAgICAgc2VsZWN0KG9uZV9vZih0YWJsZU5hbWVzJHJhd05hbWVzKSkgIyNvcmRlciBiYXNlZCBvbiBmaW5hbCBuYW1lcyBsaXN0cwoKbmFtZXMoclNxdWFyZVBvc2l0aXZlKSA8LSB0YWJsZU5hbWVzJGZpbmFsTmFtZXMgIyNjaGFuZ2UgbmFtZXMKYGBgCgoKYGBge3IsIGVjaG89RkFMU0V9CiMjU2F2aW5nIHRoZSBkYXRhc2V0cwp4bHN4Ojp3cml0ZS54bHN4KGFsbE1pbmltdW0sIGZpbGUgPSAiLi4vUmVzdWx0cy9UYWJsZXMvYWxsUmVzdWx0cy54bHN4Iiwgc2hlZXROYW1lID0gImFsbE1pbmltdW0iKQp4bHN4Ojp3cml0ZS54bHN4KGdxbnNld01pbmltdW0sIGZpbGUgPSAiLi4vUmVzdWx0cy9UYWJsZXMvYWxsUmVzdWx0cy54bHN4Iiwgc2hlZXROYW1lID0gImdxbnNld01pbmltdW0iLCBhcHBlbmQ9VFJVRSkKeGxzeDo6d3JpdGUueGxzeChyU3F1YXJlU2VsZWN0aW9uLCBmaWxlID0gIi4uL1Jlc3VsdHMvVGFibGVzL2FsbFJlc3VsdHMueGxzeCIsIHNoZWV0TmFtZSA9ICJyU3F1YXJlU2VsZWN0aW9uIiwgYXBwZW5kPVRSVUUpCnhsc3g6OndyaXRlLnhsc3goclNxdWFyZVBvc2l0aXZlLCBmaWxlID0gIi4uL1Jlc3VsdHMvVGFibGVzL2FsbFJlc3VsdHMueGxzeCIsIHNoZWV0TmFtZSA9ICJyU3F1YXJlUG9zaXRpdmUiLCBhcHBlbmQ9VFJVRSkKYGBgCgoKIyNNYWtpbmcgYWxsIHRoZSBjaGFydHMKVGhlIGNvZGUgZm9yIGNyZWF0aW5nIHRoZSByZXN1bHRzIGlzIGhpZGRlbiB0byBtYWtlIHRoaXMgcmVwb3J0IGNvbmNpc2UuIFRoZSBzZWN0aW9uIGJlbG93IGxvb3BzIHRocm91Z2ggYWxsIHRoZSByZXN1bHRzIGZvciBlYWNoIG1vZGVsIHNlbGVjdGlvbiBwcm9jZXNzIGFuZCBjcmVhdGVzIGNoYXJ0cyBmb3IgZWFjaC4KCkFsbCB0aGUgY2hhcnRzIGluIHJlZmVyZW5jZSB0byB0aGUgdGVybXMgdGhhdCBhcmUgcmVsZXZhbnQgZm9yIEdRCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFfQojI0NvbnZlcnQgdG8gbnVtZXJpYwpjaGFydERhdGEgPC0gYWxsTWluaW11bSAlPiUgCiAgICAgICAgbXV0YXRlX2F0KDg6MTcsIC5mdW5zID0gZnVucyhhcy5udW1lcmljKHN0cl9yZXBsYWNlX2FsbCguLCAiXFwqIiwgIiIpKSkpICU+JSAKICAgICAgICBzZWxlY3QoeVZhciwgOCwgMTAsIDEyLCAxNCwgMTYpICMjc2VsZWN0IG9ubHkgdGhlIEdRIHRlcm1zCgojI1RoZSBkYXRhZnJhbWUgb2YgbmFtZXMgdG8gaXRlcmF0ZSB0aHJvdWdoCnpWYXJzIDwtIGFsbE1pbmltdW0gJT4lIAogICAgICAgIHNlbGVjdCgxLCA0OjcpCgojI091dGNvbWUgdmFyaWFibGVzCnlWYXJzIDwtIHJlYWRfY3N2KCIuLi9kYXRhLzEgQ2xlYW5lZCBmaWxlcyBmb3IgYW5hbHlzaXMvUmVncmVzc2lvbiBWYXJpYWJsZXMveVZhcnNGaW5hbC5jc3YiKSAlPiUgCiAgICAgICAgc2VsZWN0KHZhck5hbWVzLCB5VHlwZSwgdGl0bGUpICU+JSAKICAgICAgICBhcnJhbmdlKHlUeXBlLCB2YXJOYW1lcykKYGBgCgoKYGBge3IsIGVjaG89RkFMU0V9CiNJIHVzZSBhIGN1c3RvbSBmdW5jdGlvbiB0byBjYWxjdWxhdGUgIEdhbW1hIHggWihAMTB0aCBwZXJjZW50aWxlKSBhbmQgR2FtbWEgeCBaKEA5MHRoIHBlcmNlbnRpbGUpLgpjYWxjdWxhdGVQZXJjZW50aWxlcyA8LSBmdW5jdGlvbih4KXsKICAgICAgICAjI2NhbGN1bGF0ZSB0aGUgMC4xIGFuZCAwLjkgcGVyY2VudGlsZSB2YWx1ZXMKICAgICAgICBjYXBpdGFsVmFyIDwtIHF1YW50aWxlKHVubGlzdChhbGxEYXRhW3hbMl1dLCB1c2UubmFtZXMgPSBGKSwgcHJvYnMgPSBjKDAuMSwgMC45KSwgbmFtZXMgPSBGLCBuYS5ybSA9IFQpCiAgICAgICAgbGFib3VyVmFyIDwtIHF1YW50aWxlKHVubGlzdChhbGxEYXRhW3hbM11dLCB1c2UubmFtZXMgPSBGKSwgcHJvYnMgPSBjKDAuMSwgMC45KSwgbmFtZXMgPSBGLCBuYS5ybSA9IFQpCiAgICAgICAgbGFuZFZhciA8LSBxdWFudGlsZSh1bmxpc3QoYWxsRGF0YVt4WzRdXSwgdXNlLm5hbWVzID0gRiksIHByb2JzID0gYygwLjEsIDAuOSksIG5hbWVzID0gRiwgbmEucm0gPSBUKQogICAgICAgIHByb2R1Y3RWYXIgPC0gcXVhbnRpbGUodW5saXN0KGFsbERhdGFbeFs1XV0sIHVzZS5uYW1lcyA9IEYpLCBwcm9icyA9IGMoMC4xLCAwLjkpLCBuYW1lcyA9IEYsIG5hLnJtID0gVCkKICAgICAgICAKICAgICAgICAjI291dHB1dCBhIGRhdGEgZnJhbWUgd2l0aCB0aGUgdmFsdWVzCiAgICAgICAgdGliYmxlKHlWYXIgPSB4WzFdLCB6VmFyQ29tYm8gPSBwYXN0ZSh4WzJdLCB4WzNdLCB4WzRdLCB4WzVdLCBzZXAgPSAiLCAiKSxjYXBpdGFsMTAgPSBjYXBpdGFsVmFyWzFdLCBjYXBpdGFsOTAgPSBjYXBpdGFsVmFyWzJdLCBsYWJvdXIxMCA9IGxhYm91clZhclsxXSwgbGFib3VyOTAgPSBsYWJvdXJWYXJbMl0sIGxhbmQxMCA9IGxhbmRWYXJbMV0sIGxhbmQ5MCA9IGxhbmRWYXJbMl0sIHByb2R1Y3QxMCA9IHByb2R1Y3RWYXJbMV0sIHByb2R1Y3Q5MCA9IHByb2R1Y3RWYXJbMl0pCn0KYGBgCgoKYGBge3IsIGVjaG89RkFMU0V9CiMjQ2FsY3VsYXRlIHRoZSB2YWx1ZXMKcGVyY2VudGlsZVZhbHVlcyA8LSBiaW5kX3Jvd3MoYXBwbHkoelZhcnMsIDEsIGNhbGN1bGF0ZVBlcmNlbnRpbGVzKSklPiUgIyNhcHBseSBmdW5jdGlvbiB0byBsaXN0IG9mIHpWYXJzCiAgICAgICAgZ2F0aGVyKGtleSA9IHR5cGUsIHZhbHVlID0gbWFya2V0RWZmZWN0LCAzOjEwKSAlPiUgCiAgICAgICAgc2VwYXJhdGUodHlwZSwgaW50byA9IGMoIm1hcmtldCIsICJwZXJjZW50aWxlIiksIHNlcCA9IC0zKSAlPiUgCiAgICAgICAgYXJyYW5nZSh5VmFyKSAlPiUgCiAgICAgICAgbGVmdF9qb2luKC4sIGNoYXJ0RGF0YSwgYnkgPSAieVZhciIpICU+JQogICAgICAgIHVuZ3JvdXAoKSAlPiUgCiAgICAgICAgbXV0YXRlKG1hcmtldEVmZmVjdCA9IGlmZWxzZShtYXJrZXQgPT0gImNhcGl0YWwiLCBtYXJrZXRFZmZlY3QgKiBjYXBpdGFsR1EsIGlmZWxzZShtYXJrZXQgPT0gImxhYm91ciIsIG1hcmtldEVmZmVjdCAqIGxhYm91ckdRLCBpZmVsc2UobWFya2V0ID09ICJsYW5kIiwgbWFya2V0RWZmZWN0ICogbGFuZEdRLCBtYXJrZXRFZmZlY3QgKiBwcm9kdWN0R1EpKSkpICU+JSAKICAgICAgICBzZWxlY3QoMTo1KSAlPiUgCiAgICAgICAgbXV0YXRlKGZpbGxWYXIgPSBpZmVsc2UobWFya2V0RWZmZWN0IDwgMCwgIlJlZHVjZWQgSW1wYWN0IiwgIkltcHJvdmVkIEltcGFjdCIpKSAlPiUgCiAgICAgICAgbGVmdF9qb2luKC4sIHlWYXJzLCBieSA9IGMoInlWYXIiID0gInZhck5hbWVzIikpIApgYGAKCgpgYGB7ciwgZWNobz1GQUxTRX0KIyNGdW5jdGlvbiB0byBjcmVhdGUgdGhlIHBsb3RzCmNyZWF0ZUNoYXJ0cyA8LSBmdW5jdGlvbihjaGFydERhdGEsIHRpdGxlTmFtZSwgc3ViVGl0bGVOYW1lKXsKICAgICAgICBnZ3Bsb3QoY2hhcnREYXRhLCBhZXMoeCA9IHBlcmNlbnRpbGUsIHkgPSBtYXJrZXRFZmZlY3QsIGZpbGwgPSBmaWxsVmFyKSkgKwogICAgICAgIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCB3aWR0aCA9IC45KSArCiAgICAgICAgc2NhbGVfZmlsbF9tYW51YWwobmFtZT0gIiIsIHZhbHVlcz1jKCJSZWR1Y2VkIEltcGFjdCI9ImZpcmVicmljazMiLCJJbXByb3ZlZCBJbXBhY3QiID0gImJsdWUiKSkgKwogICAgICAgIGZhY2V0X3dyYXAofm1hcmtldCwgZHJvcCA9IFQsIHN0cmlwLnBvc2l0aW9uID0gImJvdHRvbSIsIG5yb3cgPSAxKSArCiAgICAgICAgbGFicyh0aXRsZSA9IHRpdGxlTmFtZSwgc3VidGl0bGUgPSBzdWJUaXRsZU5hbWUsIHkgPSAiQ29tcGxlbWVudGFyeSBlZmZlY3RzIikgKwogICAgICAgIHRoZW1lX3R1ZnRlKCkgKwogICAgICAgIGd1aWRlcyhmaWxsPWd1aWRlX2xlZ2VuZChucm93PTEsIGJ5cm93ID0gVFJVRSkpICsKICAgICAgICB0aGVtZSh0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIG1hcmdpbiA9ICh0ID0gMSksIGZhY2UgPSAiYm9sZCIpLGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAKICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLCAKICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAKICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwKICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLCAKICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgICAgICAgICAgICBwYW5lbC5zcGFjaW5nID0gdW5pdCgwLCAibGluZXMiKSwgCiAgICAgICAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgICAgICAgc3RyaXAucGxhY2VtZW50ID0gIm91dHNpZGUiKQogICAgICAgIAp9CgpgYGAKCiMxLiBBbGwgbWluaW11bSBQIFZhbHVlCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQp2YXJMaXN0IDwtIHpWYXJzICU+JSAKICAgICAgICBtdXRhdGUoelZhckNvbWJvID0gcGFzdGUoY2FwaXRhbFZhciwgbGFib3VyVmFyLCBsYW5kVmFyLCBwcm9kdWN0VmFyLCBzZXAgPSAiLCAiKSkgJT4lIAogICAgICAgIHNlbGVjdCh5VmFyLCB6VmFyQ29tYm8pCgpmb3IoaSBpbiAxOmxlbmd0aCh2YXJMaXN0JHlWYXIpKXsKICAgICAgICB5dmFyVGVtcCA8LSB2YXJMaXN0W2ksIF0keVZhcgogICAgICAgIHpWYXJDb21ib1RlbXAgPC0gdmFyTGlzdFtpLCBdJHpWYXJDb21ibwogICAgICAgIAogICAgICAgIGNoYXJ0RGF0YSA8LSBwZXJjZW50aWxlVmFsdWVzICU+JSAKICAgICAgICAgICAgICAgIGZpbHRlcih5VmFyID09ICB5dmFyVGVtcCAmIHpWYXJDb21ibyA9PSB6VmFyQ29tYm9UZW1wKQogICAgICAgIAogICAgICAgIHRpdGxlTmFtZSA8LSB1bmlxdWUoY2hhcnREYXRhJHRpdGxlKQogICAgICAgIHN1YlRpdGxlTmFtZSA8LSB1bmlxdWUoY2hhcnREYXRhJHpWYXJDb21ibykKICAgICAgICBwcmludChjcmVhdGVDaGFydHMoY2hhcnREYXRhLCB0aXRsZU5hbWUsIHN1YlRpdGxlTmFtZSkpCn0KYGBgCgojMi4gR1EvTlNFVyBtaW5pbXVtIFAgVmFsdWUKYGBge3IsIGVjaG89RkFMU0V9CiMjQ29udmVydCB0byBudW1lcmljCmNoYXJ0RGF0YSA8LSBncW5zZXdNaW5pbXVtICU+JSAKICAgICAgICBtdXRhdGVfYXQoODoxNywgLmZ1bnMgPSBmdW5zKGFzLm51bWVyaWMoc3RyX3JlcGxhY2VfYWxsKC4sICJcXCoiLCAiIikpKSkgJT4lIAogICAgICAgIHNlbGVjdCh5VmFyLCA4LCAxMCwgMTIsIDE0LCAxNikgIyNzZWxlY3Qgb25seSB0aGUgR1EgdGVybXMKCiMjVGhlIGRhdGFmcmFtZSBvZiBuYW1lcyB0byBpdGVyYXRlIHRocm91Z2gKelZhcnMgPC0gZ3Fuc2V3TWluaW11bSAlPiUgCiAgICAgICAgc2VsZWN0KDEsIDQ6NykKCiMjQ2FsY3VsYXRlIHRoZSB2YWx1ZXMKcGVyY2VudGlsZVZhbHVlcyA8LSBiaW5kX3Jvd3MoYXBwbHkoelZhcnMsIDEsIGNhbGN1bGF0ZVBlcmNlbnRpbGVzKSklPiUgIyNhcHBseSBmdW5jdGlvbiB0byBsaXN0IG9mIHpWYXJzCiAgICAgICAgZ2F0aGVyKGtleSA9IHR5cGUsIHZhbHVlID0gbWFya2V0RWZmZWN0LCAzOjEwKSAlPiUgCiAgICAgICAgc2VwYXJhdGUodHlwZSwgaW50byA9IGMoIm1hcmtldCIsICJwZXJjZW50aWxlIiksIHNlcCA9IC0zKSAlPiUgCiAgICAgICAgYXJyYW5nZSh5VmFyKSAlPiUgCiAgICAgICAgbGVmdF9qb2luKC4sIGNoYXJ0RGF0YSwgYnkgPSAieVZhciIpICU+JQogICAgICAgIHVuZ3JvdXAoKSAlPiUgCiAgICAgICAgbXV0YXRlKG1hcmtldEVmZmVjdCA9IGlmZWxzZShtYXJrZXQgPT0gImNhcGl0YWwiLCBtYXJrZXRFZmZlY3QgKiBjYXBpdGFsR1EsIGlmZWxzZShtYXJrZXQgPT0gImxhYm91ciIsIG1hcmtldEVmZmVjdCAqIGxhYm91ckdRLCBpZmVsc2UobWFya2V0ID09ICJsYW5kIiwgbWFya2V0RWZmZWN0ICogbGFuZEdRLCBtYXJrZXRFZmZlY3QgKiBwcm9kdWN0R1EpKSkpICU+JSAKICAgICAgICBzZWxlY3QoMTo1KSAlPiUgCiAgICAgICAgbXV0YXRlKGZpbGxWYXIgPSBpZmVsc2UobWFya2V0RWZmZWN0IDwgMCwgIlJlZHVjZWQgSW1wYWN0IiwgIkltcHJvdmVkIEltcGFjdCIpKSAlPiUgCiAgICAgICAgbGVmdF9qb2luKC4sIHlWYXJzLCBieSA9IGMoInlWYXIiID0gInZhck5hbWVzIikpIApgYGAKCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQp2YXJMaXN0IDwtIHpWYXJzICU+JSAKICAgICAgICBtdXRhdGUoelZhckNvbWJvID0gcGFzdGUoY2FwaXRhbFZhciwgbGFib3VyVmFyLCBsYW5kVmFyLCBwcm9kdWN0VmFyLCBzZXAgPSAiLCAiKSkgJT4lIAogICAgICAgIHNlbGVjdCh5VmFyLCB6VmFyQ29tYm8pCgpmb3IoaSBpbiAxOmxlbmd0aCh2YXJMaXN0JHlWYXIpKXsKICAgICAgICB5dmFyVGVtcCA8LSB2YXJMaXN0W2ksIF0keVZhcgogICAgICAgIHpWYXJDb21ib1RlbXAgPC0gdmFyTGlzdFtpLCBdJHpWYXJDb21ibwogICAgICAgIAogICAgICAgIGNoYXJ0RGF0YSA8LSBwZXJjZW50aWxlVmFsdWVzICU+JSAKICAgICAgICAgICAgICAgIGZpbHRlcih5VmFyID09ICB5dmFyVGVtcCAmIHpWYXJDb21ibyA9PSB6VmFyQ29tYm9UZW1wKQogICAgICAgIAogICAgICAgIHRpdGxlTmFtZSA8LSB1bmlxdWUoY2hhcnREYXRhJHRpdGxlKQogICAgICAgIHN1YlRpdGxlTmFtZSA8LSB1bmlxdWUoY2hhcnREYXRhJHpWYXJDb21ibykKICAgICAgICBwcmludChjcmVhdGVDaGFydHMoY2hhcnREYXRhLCB0aXRsZU5hbWUsIHN1YlRpdGxlTmFtZSkpCn0KYGBgCgoKIzMuIE1heGltaXppbmcgUi1TUVVBUkUKYGBge3IsIGVjaG89RkFMU0V9CiMjQ29udmVydCB0byBudW1lcmljCmNoYXJ0RGF0YSA8LSByU3F1YXJlU2VsZWN0aW9uICU+JSAKICAgICAgICBtdXRhdGVfYXQoODoxNywgLmZ1bnMgPSBmdW5zKGFzLm51bWVyaWMoc3RyX3JlcGxhY2VfYWxsKC4sICJcXCoiLCAiIikpKSkgJT4lIAogICAgICAgIHNlbGVjdCh5VmFyLCA4LCAxMCwgMTIsIDE0LCAxNikgIyNzZWxlY3Qgb25seSB0aGUgR1EgdGVybXMKCiMjVGhlIGRhdGFmcmFtZSBvZiBuYW1lcyB0byBpdGVyYXRlIHRocm91Z2gKelZhcnMgPC0gclNxdWFyZVNlbGVjdGlvbiAlPiUgCiAgICAgICAgc2VsZWN0KDEsIDQ6NykKCiMjQ2FsY3VsYXRlIHRoZSB2YWx1ZXMKcGVyY2VudGlsZVZhbHVlcyA8LSBiaW5kX3Jvd3MoYXBwbHkoelZhcnMsIDEsIGNhbGN1bGF0ZVBlcmNlbnRpbGVzKSklPiUgIyNhcHBseSBmdW5jdGlvbiB0byBsaXN0IG9mIHpWYXJzCiAgICAgICAgZ2F0aGVyKGtleSA9IHR5cGUsIHZhbHVlID0gbWFya2V0RWZmZWN0LCAzOjEwKSAlPiUgCiAgICAgICAgc2VwYXJhdGUodHlwZSwgaW50byA9IGMoIm1hcmtldCIsICJwZXJjZW50aWxlIiksIHNlcCA9IC0zKSAlPiUgCiAgICAgICAgYXJyYW5nZSh5VmFyKSAlPiUgCiAgICAgICAgbGVmdF9qb2luKC4sIGNoYXJ0RGF0YSwgYnkgPSAieVZhciIpICU+JQogICAgICAgIHVuZ3JvdXAoKSAlPiUgCiAgICAgICAgbXV0YXRlKG1hcmtldEVmZmVjdCA9IGlmZWxzZShtYXJrZXQgPT0gImNhcGl0YWwiLCBtYXJrZXRFZmZlY3QgKiBjYXBpdGFsR1EsIGlmZWxzZShtYXJrZXQgPT0gImxhYm91ciIsIG1hcmtldEVmZmVjdCAqIGxhYm91ckdRLCBpZmVsc2UobWFya2V0ID09ICJsYW5kIiwgbWFya2V0RWZmZWN0ICogbGFuZEdRLCBtYXJrZXRFZmZlY3QgKiBwcm9kdWN0R1EpKSkpICU+JSAKICAgICAgICBzZWxlY3QoMTo1KSAlPiUgCiAgICAgICAgbXV0YXRlKGZpbGxWYXIgPSBpZmVsc2UobWFya2V0RWZmZWN0IDwgMCwgIlJlZHVjZWQgSW1wYWN0IiwgIkltcHJvdmVkIEltcGFjdCIpKSAlPiUgCiAgICAgICAgbGVmdF9qb2luKC4sIHlWYXJzLCBieSA9IGMoInlWYXIiID0gInZhck5hbWVzIikpIApgYGAKCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQp2YXJMaXN0IDwtIHpWYXJzICU+JSAKICAgICAgICBtdXRhdGUoelZhckNvbWJvID0gcGFzdGUoY2FwaXRhbFZhciwgbGFib3VyVmFyLCBsYW5kVmFyLCBwcm9kdWN0VmFyLCBzZXAgPSAiLCAiKSkgJT4lIAogICAgICAgIHNlbGVjdCh5VmFyLCB6VmFyQ29tYm8pCgpmb3IoaSBpbiAxOmxlbmd0aCh2YXJMaXN0JHlWYXIpKXsKICAgICAgICB5dmFyVGVtcCA8LSB2YXJMaXN0W2ksIF0keVZhcgogICAgICAgIHpWYXJDb21ib1RlbXAgPC0gdmFyTGlzdFtpLCBdJHpWYXJDb21ibwogICAgICAgIAogICAgICAgIGNoYXJ0RGF0YSA8LSBwZXJjZW50aWxlVmFsdWVzICU+JSAKICAgICAgICAgICAgICAgIGZpbHRlcih5VmFyID09ICB5dmFyVGVtcCAmIHpWYXJDb21ibyA9PSB6VmFyQ29tYm9UZW1wKQogICAgICAgIAogICAgICAgIHRpdGxlTmFtZSA8LSB1bmlxdWUoY2hhcnREYXRhJHRpdGxlKQogICAgICAgIHN1YlRpdGxlTmFtZSA8LSB1bmlxdWUoY2hhcnREYXRhJHpWYXJDb21ibykKICAgICAgICBwcmludChjcmVhdGVDaGFydHMoY2hhcnREYXRhLCB0aXRsZU5hbWUsIHN1YlRpdGxlTmFtZSkpCn0KYGBgCgojMy4gTWF4aW1pemluZyBSLVNRVUFSRSBBZnRlciBmaWx0ZXJpbmcgcG9zaXRpdmUgR1EvTlNFVwpgYGB7ciwgZWNobz1GQUxTRX0KIyNDb252ZXJ0IHRvIG51bWVyaWMKY2hhcnREYXRhIDwtIHJTcXVhcmVQb3NpdGl2ZSAlPiUgCiAgICAgICAgbXV0YXRlX2F0KDg6MTcsIC5mdW5zID0gZnVucyhhcy5udW1lcmljKHN0cl9yZXBsYWNlX2FsbCguLCAiXFwqIiwgIiIpKSkpICU+JSAKICAgICAgICBzZWxlY3QoeVZhciwgOCwgMTAsIDEyLCAxNCwgMTYpICMjc2VsZWN0IG9ubHkgdGhlIEdRIHRlcm1zCgojI1RoZSBkYXRhZnJhbWUgb2YgbmFtZXMgdG8gaXRlcmF0ZSB0aHJvdWdoCnpWYXJzIDwtIHJTcXVhcmVQb3NpdGl2ZSAlPiUgCiAgICAgICAgc2VsZWN0KDEsIDQ6NykKCiMjQ2FsY3VsYXRlIHRoZSB2YWx1ZXMKcGVyY2VudGlsZVZhbHVlcyA8LSBiaW5kX3Jvd3MoYXBwbHkoelZhcnMsIDEsIGNhbGN1bGF0ZVBlcmNlbnRpbGVzKSklPiUgIyNhcHBseSBmdW5jdGlvbiB0byBsaXN0IG9mIHpWYXJzCiAgICAgICAgZ2F0aGVyKGtleSA9IHR5cGUsIHZhbHVlID0gbWFya2V0RWZmZWN0LCAzOjEwKSAlPiUgCiAgICAgICAgc2VwYXJhdGUodHlwZSwgaW50byA9IGMoIm1hcmtldCIsICJwZXJjZW50aWxlIiksIHNlcCA9IC0zKSAlPiUgCiAgICAgICAgYXJyYW5nZSh5VmFyKSAlPiUgCiAgICAgICAgbGVmdF9qb2luKC4sIGNoYXJ0RGF0YSwgYnkgPSAieVZhciIpICU+JQogICAgICAgIHVuZ3JvdXAoKSAlPiUgCiAgICAgICAgbXV0YXRlKG1hcmtldEVmZmVjdCA9IGlmZWxzZShtYXJrZXQgPT0gImNhcGl0YWwiLCBtYXJrZXRFZmZlY3QgKiBjYXBpdGFsR1EsIGlmZWxzZShtYXJrZXQgPT0gImxhYm91ciIsIG1hcmtldEVmZmVjdCAqIGxhYm91ckdRLCBpZmVsc2UobWFya2V0ID09ICJsYW5kIiwgbWFya2V0RWZmZWN0ICogbGFuZEdRLCBtYXJrZXRFZmZlY3QgKiBwcm9kdWN0R1EpKSkpICU+JSAKICAgICAgICBzZWxlY3QoMTo1KSAlPiUgCiAgICAgICAgbXV0YXRlKGZpbGxWYXIgPSBpZmVsc2UobWFya2V0RWZmZWN0IDwgMCwgIlJlZHVjZWQgSW1wYWN0IiwgIkltcHJvdmVkIEltcGFjdCIpKSAlPiUgCiAgICAgICAgbGVmdF9qb2luKC4sIHlWYXJzLCBieSA9IGMoInlWYXIiID0gInZhck5hbWVzIikpIApgYGAKCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQp2YXJMaXN0IDwtIHpWYXJzICU+JSAKICAgICAgICBtdXRhdGUoelZhckNvbWJvID0gcGFzdGUoY2FwaXRhbFZhciwgbGFib3VyVmFyLCBsYW5kVmFyLCBwcm9kdWN0VmFyLCBzZXAgPSAiLCAiKSkgJT4lIAogICAgICAgIHNlbGVjdCh5VmFyLCB6VmFyQ29tYm8pCgpmb3IoaSBpbiAxOmxlbmd0aCh2YXJMaXN0JHlWYXIpKXsKICAgICAgICB5dmFyVGVtcCA8LSB2YXJMaXN0W2ksIF0keVZhcgogICAgICAgIHpWYXJDb21ib1RlbXAgPC0gdmFyTGlzdFtpLCBdJHpWYXJDb21ibwogICAgICAgIAogICAgICAgIGNoYXJ0RGF0YSA8LSBwZXJjZW50aWxlVmFsdWVzICU+JSAKICAgICAgICAgICAgICAgIGZpbHRlcih5VmFyID09ICB5dmFyVGVtcCAmIHpWYXJDb21ibyA9PSB6VmFyQ29tYm9UZW1wKQogICAgICAgIAogICAgICAgIHRpdGxlTmFtZSA8LSB1bmlxdWUoY2hhcnREYXRhJHRpdGxlKQogICAgICAgIHN1YlRpdGxlTmFtZSA8LSB1bmlxdWUoY2hhcnREYXRhJHpWYXJDb21ibykKICAgICAgICBwcmludChjcmVhdGVDaGFydHMoY2hhcnREYXRhLCB0aXRsZU5hbWUsIHN1YlRpdGxlTmFtZSkpCn0KYGBgCgoKIyNUZW1wb3Jhcnkgc2VjdGlvbiBmb3IgY2hlY2tzCmBgYHtyfQpzdGVwKHBsbShsb2dHZHBQYyB+IGdxRGlzdFR5cGUgKyBuc2V3RGlzdFR5cGUgKyBlX3ByX2ZpbjMgKyBlZHVfdGVyXzE1X3QrIGNyX3MgKyBlc3Rfc2hfMSArIGdxRGlzdFR5cGUgKiBwb3N0R1EgKyBuc2V3RGlzdFR5cGUgKiBwb3N0TlNFVyArIGdxRGlzdFR5cGUgKiBwb3N0R1EgKiBlX3ByX2ZpbjMgKyBncURpc3RUeXBlICogcG9zdEdRICogZWR1X3Rlcl8xNV90ICsgZ3FEaXN0VHlwZSAqIHBvc3RHUSAqIGNyX3MgKyBncURpc3RUeXBlICogcG9zdEdRICogZXN0X3NoXzEgKyBuc2V3RGlzdFR5cGUgKiBwb3N0TlNFVyAqIGVfcHJfZmluMyArIG5zZXdEaXN0VHlwZSAqIHBvc3ROU0VXICogZWR1X3Rlcl8xNV90ICsgbnNld0Rpc3RUeXBlICogcG9zdE5TRVcgKiBjcl9zICsgbnNld0Rpc3RUeXBlICogcG9zdE5TRVcgKiBlc3Rfc2hfMSArIGdxRGlzdFR5cGUqcG9zdEdRKm5zZXdEaXN0VHlwZSpwb3N0TlNFVyArIHNwYXRpYWxTdGF0ZSAqIHllYXIsIGRhdGEgPSBhbGxEYXRhKSwgZGlyZWN0aW9uID0gImJvdGgiKQpzdW1tYXJ5KG1vZGVsKQoKZ2dwbG90KGZpbHRlcihhbGxEYXRhLCBsb2dHZHBQYyA+IDUpLCBhZXMoeCA9IGNyX3MsIHkgPSBsb2dHZHBQYykpICsgZ2VvbV9wb2ludCgpICsgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikKYGBgCgo=